package com.atguigu.daijia.rules.config;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DroolsConfig {

    private static final String RULES_CUSTOMER_RULES_DRL = "rules/FeeRule.drl";

    // 定义一个KieContainer bean，用于管理和操作规则引擎的规则库
    @Bean
    public KieContainer kieContainer() {
        // 获取KieServices实例，KieServices是规则引擎的核心接口，用于访问和管理Kie资源
        KieServices kieServices = KieServices.Factory.get();

        // 创建一个新的KieFileSystem对象，KieFileSystem用于向规则引擎添加新的Kie资源（如规则文件）
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        // 将客户规则文件写入KieFileSystem，这些规则文件定义了业务规则
        kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_CUSTOMER_RULES_DRL));

        // 创建一个新的KieBuilder对象，KieBuilder用于编译KieFileSystem中的资源
        KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
        // 编译所有资源，这一步会将之前写入的规则文件编译成可执行的规则对象
        kb.buildAll();

        // 获取编译后的KieModule对象，KieModule代表一组编译后的规则和资源
        KieModule kieModule = kb.getKieModule();
        // 根据KieModule的发布ID创建一个新的KieContainer对象并返回
        // KieContainer是运行时环境，用于执行规则
        return kieServices.newKieContainer(kieModule.getReleaseId());
    }
}
